from django.shortcuts import render,redirect
#导包
from django.http import HttpResponse,HttpResponseRedirect,JsonResponse
#导入类视图
from django.views import View

from myapp.models import User
import json
from django.core.serializers import serialize
from rest_framework.response import Response
from rest_framework.views import APIView
#导入加密库
import hashlib
#导入图片库
#绘画库
from PIL import ImageDraw
#字体库
from PIL import ImageFont
#图片库
from PIL import Image
#随机库
import random
#文件流
import io

import requests

#导入上传文件夹配置
from mydjango.settings import UPLOAD_ROOT
import os

#导入原生sql模块
from django.db import connection

import jwt

#导入redis数据库
import redis

#导入时间模块
import time

#导入公共目录变量
from mydjango.settings import BASE_DIR

#导包
from django.db.models import Q,F

#导入dwebsocket的库
# from dwebsocket.decorators import accept_websocket

#定义地址和端口
host = '127.0.0.1'
port = 6379


#建立redis连接
r = redis.Redis(host=host,port=port)

import uuid

#md5 加密方法
def make_password(mypass):
    #生成MD5对象
    md5 = hashlib.md5()
    #定义加密对象
    sign_str = mypass
    #转码
    sign_utf8 = str(sign_str).encode(encoding="utf-8")
    #加密操作
    md5.update(sign_utf8)
    #生成密文
    md5_server = md5.hexdigest()
    return md5_server



#注册接口
# 注册接口
class Register(APIView):
    def get(self,request):
        # 接收参数
        username = request.GET.get('username','未收到用户名')
        password = request.GET.get('password','未收到密码')
        code = request.GET.get('code','未收到验证码')
        # 从session 中获取验证码
        # session_code = request.session.get('code',None)
        # print(session_code)
        # print(code,'*****')

        # 从redis中获取生成好的验证码并进行转码
        mycode = r.get('code').decode('utf-8')

        resp = {}
        # 判断注册页面输入验证码是否与session中获取到得验证码一致
        if code != mycode:
            resp['code'] = 405
            resp['massage'] = '验证码输入错误'
            return Response(resp)
        else:
            resp['code'] = 200
            resp['code'] = mycode
        # 排重操作
        user = User.objects.filter(username=username).first()

        if user:
            resp = {}
            resp['code'] = 405
            resp['message'] = '用户已经存在'
            return Response(resp)
        # 进行入库操作
        user = User(username=username,password=make_password(password),
                    img='',type=0)
        user.save()
        resp = {}
        resp['code'] = 200
        resp['massage'] = "注册成功"
        return Response(resp)

#定义上传路径
from mydjango.settings import UPLOAD_ROOT
#导入七牛云模块 
from qiniu import Auth,put_data
class QiNiu(APIView):
    def get(self,request):

        # 声明密钥对象
        access_key = 'cqa3XXv9g3F_vCVw5vBuWk8FUjV1evJlFZBDQedW'
        secret_key = 'YjYcETJ1_g-J5EHIrk6KkNnrTgnLnGHKvOH4Ms5D'
        q = Auth(access_key,secret_key)

        #生成令牌
        token = q.upload_token('haha12')

        #令牌返回给其那段
        return Response({'uptoken':token})








#上传文件
class UploadFile(View):

    def post(self, request):
        # 接收文件
        myfile = request.FILES.get('file')
        # 判断该文件是否已存在
        if os.access(UPLOAD_ROOT+'/'+myfile.name,os.F_OK):
            # 如果存在，给myfile赋值为空
            myfile = ''
            return HttpResponse(json.dumps({'filename': myfile}, ensure_ascii=False),
                                content_type='application/json')
        else:
            # 建立文件流对象
            f = open(os.path.join(UPLOAD_ROOT, '', str(myfile.name).replace('"','')), 'wb')
            # 进行写文件
            for chunk in myfile.chunks():
                f.write(chunk)
            # 关闭文件
            f.close()
            # 返回文件名
        return HttpResponse(json.dumps({'filename': str(myfile.name).replace('"','')}, ensure_ascii=False),
                                       content_type='application/json')

#导入序列化对象
from myapp.myser import UserSer

#用户信息接口
class UserInfo(APIView):
    def get(self,request):
        
        #获取用户id
        uid = request.GET.get('uid')

        #读取数据库
        users = User.objects.filter(id=int(uid)).first()
        #进行序列化  取一条信息不用many
        user_ser = UserSer(users)

        #进行返回
        return Response(user_ser.data)

def UserInfo_json(request):
        #读取数据库
        users = User.objects.all()
        #序列化操作
        mylist = json.loads(serialize('json',users,ensure_ascii=False))

        #返回
        return JsonResponse(mylist,safe=False,json_dumps_params={'ensure_ascii':False})



        
#用户更新接口
class UpdateUser(APIView):
    def get(self,request):
        
        #接受参数
        uid = request.GET.get("uid")
        img = request.GET.get('img')

        #查询用户
        user = User.objects.get(id=int(uid))

        #设置头像
        user.img = img 
        user.save()

        return Response({'message':"修改成功"})

class UpdatePassword(APIView):
    def get(self,request):
        uid = request.GET.get('uid')
        password = request.GET.get('password')
        
        user = User.objects.get(id=int(uid))

        if make_password(password) == user.password:
            return Response({'message':"密码与原密码一致"})

        user.password =make_password(password)
        user.save()

        return Response({'message':"修改成功"})

       



        
                                                          

import time
import hmac
import base64
from hashlib import sha256
import urllib
import json

#构造钉钉回调方法
def ding_back(request):

    #获取code
    code = request.GET.get("code")

    t = time.time()
    #时间戳
    timestamp = str((int(round(t * 1000))))
    appSecret ='ly-AzMKMmCKQP3geaILT_An32kEfKO3HeOtApy5CgKwjytevVZC0WYsT2gxMB160'
    #构造签名
    signature = base64.b64encode(hmac.new(appSecret.encode('utf-8'),timestamp.encode('utf-8'), digestmod=sha256).digest())
    #请求接口，换取钉钉用户名
    payload = {'tmp_auth_code':code}
    headers = {'Content-Type': 'application/json'}
    res = requests.post('https://oapi.dingtalk.com/sns/getuserinfo_bycode?signature='+urllib.parse.quote(signature.decode("utf-8"))+"&timestamp="+timestamp+"&accessKey=dingoaukgkwqknzjvamdqh",data=json.dumps(payload),headers=headers)

    res_dict = json.loads(res.text)
    # res_dict1 = eval(res_dict)
    print(res_dict)
    x = len(res_dict)
    print(x)
    #取出nick的值
    print(res_dict['user_info']['nick'])

    #判断是否用钉钉登录过
    dingding = User.objects.filter(username=str(res_dict['user_info']['nick'])).first()

    dingding_id = ""
    use_id = ""

    if dingding:
        #代表曾经登录过
        dingding_id = dingding.username
        use_id = dingding.id

    else:
        #自动创建账号 入库操作
        dingding = User(username=str(res_dict['user_info']['nick']),password="",type=0)

        #保存
        dingding.save()

        #查询用户id
        dingding = User.objects.filter(username=str(res_dict['user_info']['nick'])).first()

        dingding_id = str(res_dict['user_info']['nick'])
        use_id = dingding.id
    


    #将返回的数据进行解码
  
    return redirect('http://localhost:8080?dingding_id='+str(dingding_id)+"&uid="+str(use_id)) 



# 新浪微博回调视图
def weibo_back(request):
    #获取code
    code = request.GET.get('code')
    #换取网址
    access_token_url = 'https://api.weibo.com/oauth2/access_token'
    #发送请求进行换取
    re_dict = requests.post(
        access_token_url,
        data={
            "client_id":'2636039333',
            "client_secret":'4e2fbdb39432c31dc5c2f90be3afa5ce',
            "grant_type":'authorization_code',
            "code":code,
            "redirect_uri":'http://127.0.0.1:8000/md_admin/weibo'
        }

    ).text
    #查看
    print(re_dict)
   
    #将返回的数据进行解码
    re_dict = eval(re_dict)
    
    #判断是否用新浪登录过
    user = User.objects.filter(username=str(re_dict['uid'])).first()
    
    sina_id = ""
    user_id = ""

    if user:
        #代表曾经登录过
        sina_id = user.username
        user_id = user.id
    else: 
        #自动创建账号 入库操作
        user = User(username=str(re_dict['uid']),password="",type=0)
        #保存  
        user.save()

        #查询用户id
        user = User.objects.filter(username=str(re_dict['uid'])).first()

        sina_id = str(re_dict['uid'])
        user_id = user.id

    # print(sina_id)
    # print(user_id)    
    #跳转操作
    return redirect('http://localhost:8080?sina_id='+str(sina_id)+"&uid="+str(user_id)) 
    # return HttpResponse(re_dict['uid'])

#导入验证码
class MyCode(View):
    #定义随机验证颜色
    def get_random_color(self):
        R = random.randrange(255)
        G = random.randrange(255)
        B = random.randrange(255)
        return (R,G,B)

    #随机验证码
    def get(self,request):
        #画布
        img_size= (110,50)
        image = Image.new("RGB",img_size,'white')
        #画笔
        draw = ImageDraw.Draw(image,'RGB')
        #定义随机字符串
        source = '0123456789'
        #容器，用来接受随机字符串
        code_str = ''
        for i in range(4):
            #获取字体随机颜色
            text_color = self.get_random_color()
            #获取字符串
            tmp_num = random.randrange(len(source))
            #获取字符集
            random_str = source[tmp_num]
            #添加到容器中
            code_str += random_str
            #绘制
            draw.text((10+30*i,20),random_str,text_color)
        #实现文件流的形式
        buf = io.BytesIO()
        #将图片保存到缓冲区
        image.save(buf,'png')
        #将随机码存储到redis中
        r.set('code',code_str)
        #将验证码存储到session中
        request.session['code'] = code_str

        return HttpResponse(buf.getvalue(),'image/png')

 # 登录

class Login(APIView):
    def get(self,request):
        resp = {}
        # 获取用户名及密码
        username = request.GET.get('username')
        password = request.GET.get('password')

        # 判断username是否存在
        user = User.objects.filter(username=username,password=make_password(password)).first()
        if user:
            # 判断密码是否正确
            resp['code'] = 200
            resp['message'] = '登录成功'
            resp['username'] = username
            resp['uid'] = user.id
        else:
            resp['code'] = 405
            resp['message'] = '用户名或密码错误'
        return Response(resp)